package es.upv.epsa.mobweb.moneyback.utils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.Environment;
import android.text.format.Time;

public class AppUtils {
	
	/**
	 * Realiza una llamada al número de teléfono especificado
	 * 
	 * @param context 	Contexto de la aplicación
	 * @param phone 	Número de teléfono al que llamar
	 */
	public static void makeCall(Context context, String phone){
		if(phone != null){
			Intent intent = new Intent(Intent.ACTION_CALL);
			intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			intent.setData(Uri.parse("tel:" + phone));
			context.startActivity(intent);
		}
	}

	/**
	 * Abre la página web solicitada en el navegador por defecto
	 * 
	 * @param context Contexto de la aplicación
	 * @param website URL de la página web que se abrirá
	 */
	public static void openWebsite(Context context, String website){
		if(website != null){
			Intent intent = new Intent(Intent.ACTION_VIEW);
			intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

			if(!website.contains("http://") && !website.contains("https://"))
				website = "http://" + website;

			intent.setData(Uri.parse(website));
			context.startActivity(intent);
		}
	}

	/**
	 * Realizada una llamada a una url sin abrirla en la navegador
	 * Útil para pasar parámetros desde una aplicación a un servidor web
	 * 
	 * @param url URL del servicio web que se llamará. Ej.: http://www.url.com?var1=dato1&var2=dato2
	 */
	public static void getURLService(String url){
		String urlMod = "";

		urlMod = url.replace(" ", "%20"); // Los espacios en blanco no están soportados
		urlMod = urlMod.replace("<", ""); // Caracter conflictivo
		urlMod = urlMod.replace(">", ""); // Caracter conflictivo

		HttpClient mClient	= new DefaultHttpClient();
		HttpGet get 		= new HttpGet(urlMod);

		try{
			mClient.execute(get);
		}catch (Exception e){
			e.printStackTrace();
		}
	}

	/**
	 * Abre en el Market los detalles de la aplicación
	 * 
	 * @param context 	Contexto de la aplicación
	 * @param link 		link del market de la aplicación que se abrirá (Ej.: market://details?id=com.package)
	 */
	public static void openMarketLink(Context context, String link){
		if(link != null){
			Intent intent = new Intent(Intent.ACTION_VIEW);
			intent.setData(Uri.parse(link));
			context.startActivity(intent);
		}
	}

	/**
	 * Abre el vídeo de YouTube especificado
	 * 
	 * @param context 	Contexto de la aplicación
	 * @param videoUri 	URL completa del vídeo de YouTube que se va a visualizar
	 */
	public static void openYoutubeVideo(Context context, String videoUri){
		if(videoUri != null){
			Intent intent = new Intent(Intent.ACTION_VIEW);
			intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			intent.setData(Uri.parse(videoUri));
			context.startActivity(intent);
		}
	}

	/**
	 * Método para copiar desde los InputStream a FileOutputStream
	 * 
	 * @param from 	InputStream de Entrada 
	 * @param to 	FileOutputStream de destino
	 * @throws IOException
	 */
	public static void copyFromTo(InputStream from, FileOutputStream to) throws IOException{
		byte[] buffer = new byte[4096];
		int bytes_read;

		while ((bytes_read = from.read(buffer)) != -1)
			// Read until EOF
			to.write(buffer, 0, bytes_read); // write

		if (from != null)
			from.close();

		if (to != null)
			to.close();
	}

	public static void CopyStream(InputStream is, OutputStream os){
		final int buffer_size = 1024;

		try{
			byte[] bytes = new byte[buffer_size];

			for(;;){
				int count = is.read(bytes, 0, buffer_size);

				if(count == -1)
					break;

				os.write(bytes, 0, count);
			}
		}catch(Exception ex){}
	}

	/**
	 * Comprueba si el teléfono tiene conexion a internet
	 * 
	 * @return true si internet está disponible, false en otro caso
	 */
	public static boolean isInternetAvailable(Context context){
		ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo netInfo = cm.getActiveNetworkInfo();

		if (netInfo != null && netInfo.isConnectedOrConnecting()) {
			return true;
		}

		return false;
	}

	/**
	 * 
	 * Formatea el valor de Time para que se pueda visualizar e 
	 * interpretar correctamente por el usuario
	 * 
	 * @param timestamp Cadena a formatear
	 * @return Cadena con el Timestamp Formateado
	 */
	public static String formatTime(Time timestamp){
		//Log.i(context.getString(R.string.app_name),"CTZ "+timestamp.gmtoff);
		if (!timestamp.allDay) {
			return timestamp.format("%v %I:%M%p");
		}else{
			return timestamp.format("%v");
		}
	}
	
	public static File getAndroidDir(Context context){
		String state = Environment.getExternalStorageState();

		if(state.contentEquals(Environment.MEDIA_MOUNTED)){
			return Environment.getExternalStorageDirectory();
		}else{
			//return Environment.getDataDirectory();
			return context.getDir("", Context.MODE_PRIVATE);
		}	
	}

	public static boolean isAppInstalled(Context context, String uri){
		PackageManager pm = context.getPackageManager();
		boolean app_installed = false;

		try{
			pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
			app_installed = true;
		}catch (PackageManager.NameNotFoundException e){
			app_installed = false;
		}

		return app_installed ;
	}
	
	public void readPhoneContacts(){
		
	}
}
